SpringBoot 框架可用于创建可执行的 Spring 应用程序,采用了习惯优于配置的方法。其中奥秘在于 @EnableAutoConfiguration
注释,此注释自动载入应用程序所需的所有 Bean——这依赖于 SpringBoot 在类路径中的查找。
1. @SpringBootApplication
首先来看 @SpringBootApplication
注解:
1 | package org.springframework.boot.autoconfigure; |
该注解上存在元注解@EnableAutoConfiguration
,这就是 Spring Boot 自动配置实现的核心入口,其定义为:
1 | "deprecation") ( |
可见通过@Import
注解,引入了EnableAutoConfigurationImportSelector
。
2. @EnableAutoConfigurationImportSelector
1 | public class EnableAutoConfigurationImportSelector |
父类 AutoConfigurationImportSelector
的 selectImports
方法如下:
1 | public String[] selectImports(AnnotationMetadata metadata) { |
该方法使用了 Spring Core 包的 SpringFactoriesLoader
类的 loadFactoryNamesof()
方法,查询 META-INF/spring.factories
文件下以 EnableAutoConfiguration
的全限定名(org.springframework.boot.autoconfigure.EnableAutoConfiguration
)为 key 的对应值,其结果为:
1 | # Auto Configure |
在这个文件中,可以看到一系列 Spring Boot 自动配置的列表。
3. MongoAutoConfiguration
以 MongoAutoConfiguration
为例:
1 |
|
这个类进行了简单的 Spring 配置,声明了 MongoDB 所需典型 Bean,并且和其他很多自动配置类一样,重度依赖于 Spring Boot 的注解(@Condition*
)。
4. 调试
以 DEBUG 级 log 启动 Springboot 项目,Spring Boot 会产生一个报告,如下:
1 | Positive matches: |
对于每个自动配置,可以看到它启动或失败的原因。